﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//class A
//{
//public:
//	virtual void f()
//	{
//		cout << "A::f()" << endl;
//	}
//};
//
//class B : public A
//{
//public:
//	virtual void f()
//	{
//		cout << "B::f()" << endl;
//	}
//};
//
//
//int main()
//{
//	//A* pa = (A*)new B;
//	A* pa = new B;//写不写这个类型强制转化都一样
//	
//	pa->f();//虚函数的继承是一种接口继承
//	B b;
//	b.f();
//
//	return 0;
//}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

class A
{
public:
	A() :m_iVal(0) { test(); }
	virtual void func() { std::cout << m_iVal << ' '; }
	void test() { func(); }
public:
	int m_iVal;
};



class B : public A
{
public:
	B() { test(); }//初始化列表会先去走基类的构造，并且注意派生类对象的虚函数表指针是在构造阶段才被初始化
	//B() → [A() → A::test() → A::func()] → 进入函数体A::test() → 进入函数体A* this->func() → B::func()
	virtual void func()
	{
		++m_iVal;
		std::cout << m_iVal << ' ';

	}
};


int main()
{
	A* p = new B;
	p->test();

	return 0;
}